package utils

import (
	"bytes"
	"context"
	"errors"
	"fmt"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"gvb-server/config"
	"gvb-server/global"
	"time"
)

// GetToken 获取token
func GetToken(q config.QiNiu) string {
	ak := q.AccessKey
	sk := q.SecretKey
	bucket := q.Bucket
	fmt.Println("qiniu~~~~~~~~~~~", sk)
	putPolicy := storage.PutPolicy{Scope: bucket}
	mac := qbox.NewMac(ak, sk)
	token := putPolicy.UploadToken(mac)
	return token
}

// GetConf 获取上传配置
func GetConf(q config.QiNiu) storage.Config {
	cfg := storage.Config{}
	zone, _ := storage.GetRegionByID(storage.RegionID(q.Zone))
	cfg.Zone = &zone
	// 是否使用https
	cfg.UseHTTPS = false
	cfg.UseCdnDomains = false
	return cfg
}

// UploadQiNiu 上传文件
func UploadQiNiu(data []byte, prefix string, name string) (filePath string, err error) {
	q := global.Config.QiNiu
	fmt.Printf("七牛参数：%v%v\n", q.AccessKey, q.SecretKey)
	if q.AccessKey == "" || q.SecretKey == "" {
		return "", errors.New("请配置AccessKey和SecretKey")
	}

	if float64(len(data)/1024/1024) > q.Size {
		return "", errors.New("文件大小超过七牛预设值")
	}

	token := GetToken(q)
	cfg := GetConf(q)

	// NewFormUploader 用来构建一个表单上传的对象
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}

	putExtra := storage.PutExtra{
		//Params: make(map[string]string),
		Params: map[string]string{},
	}
	dataLen := int64(len(data))

	// 获取当前时间戳
	now := time.Now().Format("20060102150405")

	key := fmt.Sprintf("%s/%s_%s", prefix, now, name)

	// Put 用来以表单方式上传一个文件。
	//
	// ctx     是请求的上下文。
	// ret     是上传成功后返回的数据。如果 uptoken 中没有设置 callbackUrl 或 returnBody，那么返回的数据结构是 PutRet 结构。
	// uptoken 是由业务服务器颁发的上传凭证。
	// key     是要上传的文件访问路径。比如："foo/bar.jpg"。注意我们建议 key 不要以 '/' 开头。另外，key 为空字符串是合法的。
	// data    是文件内容的访问接口（io.Reader）。
	// fsize   是要上传的文件大小。
	// extra   是上传的一些可选项。可以指定为nil。详细见 PutExtra 结构的描述。
	err = formUploader.Put(context.Background(), &ret, token, key, bytes.NewReader(data), dataLen, &putExtra)

	if err != nil {
		return "", err
	}

	url := fmt.Sprintf("%s%s", q.CDN, key)

	return url, nil
}
